﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

//class A
//{
//private:
//	static int _i;
//	int _c = 3;
//public:
//	// B默认就是A的友元
//	class B
//	{
//	public:
//		void func(const A& a)
//		{
//			cout << _i << endl; 
//			cout << a._c << endl;
//		}
//		int _b;
//	};
//};
//int A::_i = 1;
//int main()
//{
//	A::B b;
//	A a;
//	b.func(a);
//
//	cout << sizeof(A) << endl;
//
//	return 0;
//}



//class A
//{
//public:
//	A(int a = 1)
//		:_a(a)
//	{
//		cout << "A(int a)" << endl;
//	}
//	~A()
//	{
//		cout << "~A()" << endl;
//	}
//private:
//	int _a;
//};
//class B
//{
//public:
//	int func(int n) 
//	{
//		return n;
//	}
//};
//int main()
//{
//	A aa1;
//	A aa2(3);
//
//	// 不能这么定义对象，因为编译器⽆法识别下⾯是⼀个函数声明，还是对象定义
//	//A aa3();
//
//	// 我们可以这么定义匿名对象，匿名对象的特点不⽤取名字
//	// 但是他的⽣命周期只有这⼀⾏，我们可以看到下⼀⾏他就会⾃动调⽤析构函数
//	A();
//	A(1);
//
//	// 匿名对象在这样场景下就很好⽤
//	B().func(13);
//
//	return 0;
//}




//int globalVar = 1;
//static int staticGlobalVar = 1;
//void Test()
//{
//	static int staticVar = 1;
//	int localVar = 1;
//	int num1[10] = { 1, 2, 3, 4 };
//	char char2[] = "abcd";
//	const char* pChar3 = "abcd";
//	int* ptr1 = (int*)malloc(sizeof(int) * 4);
//	int* ptr2 = (int*)calloc(4, sizeof(int));
//	int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);
//	free(ptr1);
//	free(ptr3);
//}
//1. 选择题：
//选项 : A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)
//globalVar在哪里？____
//staticGlobalVar在哪里？____
//staticVar在哪里？____
//localVar在哪里？____
//num1 在哪里？____
//char2在哪里？____
//* char2在哪里？___
//pChar3在哪里？____
//* pChar3在哪里？____
//ptr1在哪里？____
//* ptr1在哪里？____




//void Test()
//{
//	// malloc/calloc/realloc的区别是什么？
//	int* p1 = (int*)malloc(sizeof(int)*4);
//	int* p2 = (int*)calloc(4, sizeof(int));
//	int* p3 = (int*)realloc(p2, sizeof(int) * 10);
//
//	// 这里需要free(p2)吗？
//	free(p1);
//	free(p3);
//}




//int main()
//{
//	// 动态申请一个int类型的空间
//	int* ptr1 = new int;
//	// 动态申请一个int类型的空间并初始化为10
//	int* ptr2 = new int(10);
//	// 动态申请3个int类型的空间
//	int* ptr3 = new int[3];
//	// 动态申请3个int类型的空间并初始化
//	int* ptr4 = new int[3] {1, 2, 3};
//
//	delete ptr1;
//	delete ptr2;
//	delete[] ptr3;
//	delete[] ptr4;
//
//	return 0;
//}




//class A
//{
//public:
//	A(int a = 1)
//		: _a(a)
//	{
//		cout << "A():" << this << endl;
//	}
//	~A()
//	{
//		cout << "~A():" << this << endl;
//	}
//private:
//	int _a;
//};
//int main()
//{
//	// 只申请空间
//	A* p1 = (A*)malloc(sizeof(A));
//	// 申请空间 + 构造函数
//	A* p2 = new A(2);
//
//	// 只释放空间
//	free(p1);
//	// 析构函数 + 释放空间
//	delete p2;
//
//	// 同样支持隐式转换
//	A* p3 = new A[5]{1, 3};
//	delete[] p3;
//
//	return 0;
//}




//struct ListNode
//{
//	int _val;
//	ListNode* _next;
//
//	ListNode(int val = 0)
//		:_val(val)
//		,_next(nullptr)
//	{}
//};
//int main()
//{
//	ListNode* p1 = new ListNode(1);
//	ListNode* p2 = new ListNode(2);
//	ListNode* p3 = new ListNode(3);
//	p1->_next = p2;
//	p2->_next = p3;
//
//	return 0;
//}




//class A
//{
//public:
//	A(int a = 1)
//		: _a(a)
//	{
//		cout << "A():" << this << endl;
//	}
//	~A()
//	{
//		cout << "~A():" << this << endl;
//	}
//private:
//	int _a;
//};
//int main()
//{
//	A* pa = (A*)operator new(sizeof(A));
//	return 0;
//}




//class A
//{
//public:
//	A(int a = 1)
//		: _a(a)
//	{
//		cout << "A():" << this << endl;
//	}
//	~A()
//	{
//		cout << "~A():" << this << endl;
//	}
//private:
//	int _a;
//};
//int main()
//{
//	// 开辟空间 + 构造函数
//	A* pa = new A;
//	delete pa;
//	return 0;
//}




//class A
//{
//public:
//	A(int a = 1)
//		: _a(a)
//	{
//		cout << "A():" << this << endl;
//	}
//	~A()
//	{
//		cout << "~A():" << this << endl;
//	}
//private:
//	int _a;
//};
//int main()
//{
//	// p1现在指向的只是与A对象相同大小的一段空间，还不能算是一个对象
//	// 因为构造函数还没有执行
//	A* p1 = (A*)malloc(sizeof(A));
//	new(p1)A; 
//	p1->~A();
//	free(p1);
//
//	A* p2 = (A*)operator new(sizeof(A));
//	new(p2)A(10);
//	p2->~A();
//	operator delete(p2);
//
//	return 0;
//}




//class A
//{
//public:
//	A(int a = 1)
//		: _a(a)
//	{
//		cout << "A():" << this << endl;
//	}
//	~A()
//	{
//		cout << "~A():" << this << endl;
//	}
//private:
//	int _a;
//	int* _p = new int;
//};
//int main()
//{
//	A* a = (A*)operator new (sizeof(A));
//	delete a;
//	return 0;
//}